package com.basic.juc;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * locate com.basic.juc
 * Created by mastertj on 2018/4/8.
 * 
 * 本类用于演示CAS（Compare And Swap）操作和AtomicInteger的使用
 * 
 * CAS是一种无锁算法，全称是Compare And Swap（比较并交换）：
 * 1. 它是一种乐观锁的实现方式，不会造成线程阻塞
 * 2. 基本思想：先比较当前值是否等于预期值，如果相等则更新为新值，否则不更新
 * 3. CAS操作是原子性的，由CPU硬件指令保证
 * 
 * AtomicInteger是java.util.concurrent.atomic包下的原子类之一：
 * 1. 它提供了原子性的整数操作，内部使用CAS实现
 * 2. 常用方法包括get()、set()、getAndIncrement()、incrementAndGet()、compareAndSet()等
 * 3. 相比于使用synchronized的同步方式，AtomicInteger的性能更好
 */
/**
 * CAS操作演示类，实现Runnable接口
 * 使用AtomicInteger实现线程安全的计数器
 */
public class CASThread implements Runnable {
    // 使用AtomicInteger作为线程安全的计数器，初始值为0
    private AtomicInteger count = new AtomicInteger(0);

    /**
     * 主方法，创建线程池并提交多个线程任务
     * 
     * @param args 命令行参数
     * @throws InterruptedException 当线程被中断时抛出此异常
     */
    public static void main(String[] args) throws InterruptedException {
        // 创建CASThread实例
        CASThread casThread = new CASThread();
        // 创建缓存线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        // 提交5个线程任务到线程池
        for (int i = 0; i < 5; i++) {
            executorService.execute(new Thread(casThread));
        }

        // 关闭线程池，不再接受新任务，但已提交的任务会继续执行
}
